﻿/*************************************************************************
 *
 * Copyright (c) 2009-2014 Xuld. All rights reserved.
 * 
 * Project Url: http://work.xuld.net/circus
 * 
 * This source code is part of the Project Circus.
 * 
 * This code is licensed under The Circus License.
 * See the file License.html for the license details.
 * 
 * 
 * You must not remove this notice, or any other, from this software.
 *
 * 
 *************************************************************************/



using System;
using System.Collections.Generic;

namespace Circus.Utility {

    /// <summary>
    /// 提供生成随机数相关的工具函数。
    /// </summary>
    public static class RandHelper {

        /// <summary>
        /// 获取或设置当前对象使用的随机数生成器。
        /// </summary>
        public static Random random = new Random(Environment.TickCount);

        /// <summary>
        /// 返回非负随机数。
        /// </summary>
        /// <returns>一个非负整数。</returns>
        public static int nextInt() {
            return random.Next();
        }

        /// <summary>
        /// 返回一个小于所指定最大值的非负随机数。
        /// </summary>
        /// <param name="maxValue">要生成的随机数的上限（随机数不能取该上限值）。 maxValue 必须大于或等于零。</param>
        /// <returns>一个非负整数。</returns>
        public static int nextInt(int maxValue) {
            return random.Next(maxValue);
        }

        /// <summary>
        /// 返回一个指定范围内的随机数。
        /// </summary>
        /// <param name="minValue">返回的随机数的下界（随机数可取该下界值）。</param>
        /// <param name="maxValue">返回的随机数的上界（随机数不能取该上界值）。 maxValue 必须大于 minValue。</param>
        /// <returns>一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数，即：返回的值范围包括 minValue 但不包括 maxValue。 如果 minValue 等于 maxValue，则返回 minValue。</returns>
        public static int nextInt(int minValue, int maxValue) {
            return random.Next(minValue, maxValue);
        }

        /// <summary>
        /// 返回一个介于 0.0 和 1.0 之间的随机数。
        /// </summary>
        /// <returns>大于等于 0.0 并且小于 1.0 的双精度浮点数。</returns>
        public static double nextDouble() {
            return random.NextDouble();
        }

        /// <summary>
        /// 返回随机标记。
        /// </summary>
        /// <returns>一个标记。</returns>
        public static string nextToken() {
            return Guid.NewGuid().ToString("N");
        }

        /// <summary>
        /// 返回一个布尔型。
        /// </summary>
        /// <returns>返回 true 或者 false。</returns>
        public static bool nextBool() {
            return random.Next(0, 1) == 1;
        }

        /// <summary>
        /// 随机分配集合的元素。
        /// </summary>
        /// <typeparam name="T"><paramref name="input"/> 的元素的类型。</typeparam>
        /// <param name="input">要分配的列表。</param>
        public static void shuffle<T>(IList<T> input) {
            shuffle<T>(input, 0, input.Count);
        }

        /// <summary>
        /// 将集合元素随机重排。
        /// </summary>
        /// <typeparam name="T"><paramref name="input"/> 中的元素的类型。</typeparam>
        /// <param name="input">可枚举的列表，如数组，集合。</param>
        /// <param name="startIndex">开始排序的位置。</param>
        /// <param name="count">要排序的元素数。</param>
        public static void shuffle<T>(IList<T> input, int startIndex, int count) {
            Random r = random;
            count += startIndex;
            for (int i = startIndex; i < count; i++) {
                int t = r.Next(startIndex, count);
                T d = input[i];
                input[i] = input[t];
                input[t] = d;
            }
        }

    }

}
